/* 
给定一个整数数组  nums，求出数组从索引 i 到 j（i ≤ j）范围内元素的总和，包含 i、j 两点。

实现 NumArray 类：

NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j（i ≤ j）范围内元素的总和，包含 i、j 两点（也就是 sum(nums[i], nums[i + 1], ... , nums[j])）
 

示例：

输入：
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出：
[null, 1, -1, -3]

解释：
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) 
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
*/

/* 
思路:在创建构造函数时就预处理数组——创建一个数组sums接收传入数组的前i项的和

每次在调用sumRange求和时，直接找sums中前right项和与前left项和的差，就是left到right的求和
*/

/* 
/**
 * @param {number[]} nums
 */
// nums=[-2, 0, 3, -5, 2, -1]
 var NumArray = function(nums) {
    const n = nums.length;
    this.sums = new Array(n + 1).fill(0);  // [0,0,0,0,0,0,0]
    // 预处理——sums索引i+1项存储的是nums索引i项的和
    for (let i = 0; i < n; i++) {
        /* 
        [0,-2,-2,1,-4,-2,-3] 
        */
        this.sums[i + 1] = this.sums[i] + nums[i]; 
    }
};

/** 
 * @param {number} left 
 * @param {number} right
 * @return {number}
 */
NumArray.prototype.sumRange = function(left, right) {
    // 每次计算都从sums中拿到right对应的值与left对应的值，所得的差就是left到right的和
    return this.sums[right + 1] - this.sums[left];
};

// 运行
let numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) 
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

console.log(nums);